﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Iudicium.Contactos.CRN
{
    /// <summary>
    /// Descripción breve de ContactoCRN
    /// </summary>
    public class ContactoCRN
    {
        public ContactoCRN() { }

        public static List<Iudicium.Contactos.Contacto> GetContactosByPropietario(int propietarioId, Contacto.TipoPropietario tipoPropietario)
        {
            if (propietarioId <= 0)
            {
                throw new ArgumentException("propietarioId no puede ser menor o igual que cero.");
            }
            
            ContactoDSTableAdapters.ContactoTableAdapter adapter = new ContactoDSTableAdapters.ContactoTableAdapter();

            ContactoDS.ContactoDataTable tabla = adapter.GetContactosByPropietarioId(propietarioId, tipoPropietario.ToString());

            if (tabla == null)
            {
                throw new Exception("Ocurrio un error en la ejecucion del SQL dado que se retornaron valores nulos");
            }

            List<Iudicium.Contactos.Contacto> lista = new List<Contacto>();

            foreach (ContactoDS.ContactoRow row in tabla)
            {
                Contacto objContacto = ConstruirContacto(row);
                if (objContacto == null)
                    continue;
                objContacto.TipoPropietarioContacto = tipoPropietario;
                lista.Add(objContacto);
            }
            return lista;
        }

        public static int InsertContacto(Contacto objContacto)
        {
            if (objContacto == null)
            {
                throw new ArgumentException("El objeto Contacto no puede ser nulo.");
            }

            if (objContacto.PropietarioId <= 0)
            {
                throw new ArgumentException("PropietarioId no puede ser menor o igual a cero.");
            }

            if (objContacto.TipoContactoId <= 0)
            {
                throw new ArgumentException("TipoContactoId no puede ser menor o igual a cero.");
            }

            if (string.IsNullOrEmpty(objContacto.Descripcion))
            {
                throw new ArgumentException("La descripcion del contacto no puede ser nulo o vacio.");
            }

            int? contactoId = 0;

            ContactoDSTableAdapters.ContactoTableAdapter adapter = new ContactoDSTableAdapters.ContactoTableAdapter();

            adapter.Insert(ref contactoId, objContacto.PropietarioId, objContacto.TipoContactoId, objContacto.TipoPropietarioContacto.ToString(), objContacto.Descripcion);

            if (contactoId == 0)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero no se genero la llave primaria");
            }

            return contactoId.Value;
        }

        public static void DeleteContactoByListId(int propietarioId, string listIds, Contacto.TipoPropietario tipoPropietario)
        {
            if(propietarioId <= 0)
            {
                throw new ArgumentException("PropietarioId no puede ser menor o igual que cero.");
            }

            if (string.IsNullOrEmpty(listIds))
            {
                throw new ArgumentException("La lista de ids de contactos a eliminar no puede ser nula o vacia.");
            }

            ContactoDSTableAdapters.ContactoTableAdapter adapter = new ContactoDSTableAdapters.ContactoTableAdapter();

            adapter.Delete(propietarioId, listIds, tipoPropietario.ToString());
        }

        private static Contacto ConstruirContacto(ContactoDS.ContactoRow row)
        {
            if (row == null)
                return null;
            return new Contacto(row.contactoId, row.propietarioId, row.tipoContactoId, row.descripcion, row.descripcionTipoContacto);
        }
    }

}
